/**
 * 这是另一个简单示例，包含网络请求
 * **/
import { FastMCP } from "fastmcp";
import { z } from "zod";

// 创建一个 MCP 服务器实例
const server = new FastMCP({
  name: "My-Tool-Box",
  description: "一个包含多个实用工具的工具箱 MCP 服务",
  version: "1.0.0",
});

// 添加第1个工具：获取当前IP地址和所在城市
server.addTool({
  name: "get-ip-city",
  description: "获取当前IP地址和所在城市",
  execute: async () => {
    const res = await fetch('https://ipinfo.io/json');
    const data = await res.json();
    return `ip地址：${data.ip}，城市：${data.city}`;
  },
});

// 添加第2个工具：万年历查询
server.addTool({
  name: "get-almanac",
  description: "万年历查询，查询指定日期的农历、节气等信息",
  parameters: z.object({
    year: z.number().describe("年，例如 2025"),
    month: z.number().describe("月，例如 5"),
    day: z.number().describe("日，例如 17"),
  }),
  execute: async (args) => {
    const res = await fetch(`https://api.tiax.cn/almanac/?year=${args.year}&month=${args.month}&day=${args.day}`);
    const data = await res.json();
    return JSON.stringify(data);
  },
});

// 添加3个工具，获取当前日期（格式：2025-06-20）
server.addTool({
  name: "get-today-date",
  description: "获取当前日期，今天的日期",
  execute: async () => {
    // 获取当前日期
    const date = new Date();
    // 格式化日期
    const year = date.getFullYear();
    const month = String(date.getMonth() + 1).padStart(2, "0");
    const day = String(date.getDate()).padStart(2, "0");
    // 返回日期字符串
    return `${year}-${month}-${day}`; // 2025-06-20
  },
});

// 添加第4个工具，添加字母计数工具
server.addTool({
  name: "count_letter_in_string",
  description: "计算字符串中指定字母出现的次数（不区分大小写）",
  parameters: z.object({
    a: z.string().describe("要搜索的字符串"),
    b: z.string().describe("要统计的字母"),
  }),
  execute: async (args) => {
    const string = args.a.toLowerCase();
    const letter = args.b.toLowerCase();
    const count = (string.match(new RegExp(letter, 'g')) || []).length;
    return `${count}`;
  },
});

// 添加第5个工具，处理加法计算
server.addTool({
  name: "addition",
  description: "对两个数字做求和计算，遇到提供两个数字求相加结果的问题，优先使用本工具处理",
  parameters: z.object({
    a: z.number().describe("第一个数字，例如 5"),
    b: z.number().describe("第二个数字，例如 3.2"),
  }),
  execute: async (args) => {
    // 执行加法计算
    return String(args.a + args.b);
  },
});

// 启动服务
server.start({
  transportType: "stdio",
});